package br.projecao.bean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.faces.bean.ManagedBean;

import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.PieChartModel;

import br.projecao.dao.AlternativaDAO;
import br.projecao.dao.QuestaoDAO;
import br.projecao.dao.RespostaDAO;
import br.projecao.dao.UsuarioDAO;
import br.projecao.modelo.Alternativa;
import br.projecao.modelo.Questao;
import br.projecao.modelo.Resposta;
import br.projecao.modelo.Usuario;

@ManagedBean
public class GraficoBean {

	private List<Resposta> respostas = new ArrayList<Resposta>();
	private PieChartModel modeloPizza;
	private List<PieChartModel> listaModeloPizza = new ArrayList<PieChartModel>();
	private List<Alternativa> alternativas = new ArrayList<Alternativa>();
	private List<Questao> questoes = null;
	private List<Usuario> usuarios = new ArrayList<Usuario>();
	private HashMap<Integer, PieChartModel> testeHash = new HashMap<Integer, PieChartModel>();
	private HashMap<Integer, CartesianChartModel> graficoCartesiano = new HashMap<Integer, CartesianChartModel>();
	private CartesianChartModel chartModel = new CartesianChartModel();

	public String getDatatipFormatIntegers() {
		return "<span style=\"display:none;\">%s</span><span>%s</span>";
	}

	public List<Alternativa> getAlternativas() {
		AlternativaDAO alternativaDAO = new AlternativaDAO();
		setAlternativas(alternativaDAO.listarTodos(Alternativa.class));
		return alternativas;
	}

	public GraficoBean() {
		criarModeloPizza();
		criarModeloCartesiano();
	}

	public void setAlternativas(List<Alternativa> alternativas) {
		this.alternativas = alternativas;
	}

	private void criarModeloPizza() {

		for (Questao questao : getQuestoes()) {
			modeloPizza = new PieChartModel();
			for (Alternativa alternativa : questao.getAlternativas()) {

				RespostaDAO respostaDAO = new RespostaDAO();
				List<Resposta> respostas = respostaDAO
						.buscaRespostaPorAlternativa(alternativa);
				if (respostas.size() != 0) {
					modeloPizza.set(alternativa.getDescricao(),
							respostas.size());
				}

			}

			testeHash.put(questao.getId(), modeloPizza);

		}

	}

	private void criarModeloCartesiano() {
		
		for (Questao questao : getQuestoes()) {
			chartModel = new CartesianChartModel();
			for (Alternativa alternativa : questao.getAlternativas()) {
				ChartSeries alternativaRotulo = new ChartSeries();

				RespostaDAO respostaDAO = new RespostaDAO();
				List<Resposta> respostas = respostaDAO
						.buscaRespostaPorAlternativa(alternativa);
				if (respostas.size() != 0) {
					alternativaRotulo.setLabel(alternativa.getDescricao());
					alternativaRotulo.set(" ",
							respostas.size());
					chartModel.addSeries(alternativaRotulo);
				}

			}

			graficoCartesiano.put(questao.getId(), chartModel);

		}
		this.questoes = null;
	}

	public List<Resposta> getRespostas() {

		return respostas;
	}

	public void setRespostas(List<Resposta> respostas) {
		this.respostas = respostas;
	}

	public PieChartModel getModeloPizza() {
		criarModeloPizza();
		return modeloPizza;
	}

	public void setModeloPizza(PieChartModel modeloPizza) {
		this.modeloPizza = modeloPizza;
	}

	public List<Questao> getQuestoes() {
		if (questoes == null) {
			QuestaoDAO dao = new QuestaoDAO();
		this.questoes = dao.listarTodos(Questao.class);
		}
		
		return questoes;
	}

	public void setQuestoes(List<Questao> questoes) {
		this.questoes = questoes;
	}

	public List<PieChartModel> getListaModeloPizza() {

		return listaModeloPizza;
	}

	public void setListaModeloPizza(List<PieChartModel> listaModeloPizza) {
		this.listaModeloPizza = listaModeloPizza;
	}

	public List<Usuario> getUsuarios() {
		UsuarioDAO dao = new UsuarioDAO();
		this.usuarios = dao.listarTodos(Usuario.class);
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public HashMap<Integer, PieChartModel> getTesteHash() {

		return testeHash;
	}

	public void setTesteHash(HashMap<Integer, PieChartModel> testeHash) {
		this.testeHash = testeHash;
	}

	public HashMap<Integer, CartesianChartModel> getGraficoCartesiano() {
		return graficoCartesiano;
	}

	public void setGraficoCartesiano(
			HashMap<Integer, CartesianChartModel> graficoCartesiano) {
		this.graficoCartesiano = graficoCartesiano;
	}

	public CartesianChartModel getChartModel() {
		return chartModel;
	}

	public void setChartModel(CartesianChartModel chartModel) {
		this.chartModel = chartModel;
	}

}
